// 作业讲解

// 作业一：

// 代码如下

for(var i = 1; i <= 3; i++) {
    setTimeout(function(){
        console.log(i);
    }, 1000);
}

// 希望 i 的值是 1、2、3，至少提供 2 种方案：一种使用let ，另一种使用闭包。

// 方法一：使用let

for(let i = 1; i <= 3; i++) {
    setTimeout(function(){
        console.log(i);
    }, 1000);
}

// 方法二：使用闭包

// 什么是闭包？子函数可以调用父函数的局部变量

function father() {
    let a = 1; // 局部变量
    function son() {
        console.log(a);
    }
    son();
}

father();

// 匿名函数：没有名字的函数

(function() {
    console.log("hello jayjun");
})();


(function(name) {
    console.log("hello " + name);
})("jaychou");

// 使用闭包和匿名函数
for(var i = 1; i <= 3; i++) {
    (function(_i){
        setTimeout(function(){
            console.log(_i);
        }, 1000);
    })(i);
}

// 作业二：如果常量是一个对象呢？请问常量还可以修改吗？

// js中赋值的两种方式

// 第一种：普通赋值（传值赋值）

let a = 1;
let b = a; // 变量a只是将值复制了一份给到变量b

console.log(a, b); // 1 1

b = 2;
console.log(a, b); // 1 2

a = 3;
console.log(a, b); // 3 2

// 第二种：引用赋值（传址赋值）

let arr1 = [1, 2, 3];
let arr2 = arr1; // 变量 arr1 将内存地址赋值给到变量 arr2

console.log(arr1, arr2);

arr1.push(4);
console.log(arr1, arr2);

arr2.pop();
console.log(arr1, arr2);

const user = {
    name: "jayjun",
    age: 18
};

user.age = 19;
user.school = "家里蹲大学";
console.log(user);

// user = {}; // Uncaught Error: "user" is read-only

const door = {
    width: 100,
    height: 200,
    color: ""
};

door.color = "red";
console.log(door);

door.color = "green";
console.log(door);

door = {}; // Error: "door" is read-only